/* Simple JavaScript Inheritance
 * By John Resig http://ejohn.org/
 * MIT Licensed.
 */
// Inspired by base2 and Prototype
(function () {
	var initializing = false,
		fnTest = /xyz/.test(function () {
			xyz;
		}) ? /\b_super\b/ : /.*/;

	// The base Class implementation (does nothing)
	this.Class = function () {};

	// Create a new Class that inherits from this class
	Class.extend = function (prop) {
		var _super = this.prototype;

		// Instantiate a base class (but only create the instance,
		// don't run the init constructor)
		initializing = true;
		var prototype = new this();
		initializing = false;

		// Copy the properties over onto the new prototype
		for (var name in prop) {
			// Check if we're overwriting an existing function
			prototype[name] = typeof prop[name] == "function" &&
				typeof _super[name] == "function" && fnTest.test(prop[name]) ?
				(function (name, fn) {
				return function () {
					var tmp = this._super;

					// Add a new ._super() method that is the same method
					// but on the super-class
					this._super = _super[name];

					// The method only need to be bound temporarily, so we
					// remove it when we're done executing
					var ret = fn.apply(this, arguments);
					this._super = tmp;

					return ret;
				};
			})(name, prop[name]) :
				prop[name];
		}

		// The dummy class constructor

		function Class() {
			// All construction is actually done in the init method
			if (!initializing && this.init)
				this.init.apply(this, arguments);
		}

		// Populate our constructed prototype object
		Class.prototype = prototype;

		// Enforce the constructor to be what we expect
		Class.prototype.constructor = Class;

		// And make this class extendable
		Class.extend = arguments.callee;

		return Class;
	};
})();

var TagForm = Class.extend({
	init: function(id, option){
		this.option = $.extend({
			onShow: function() {},
			onHide: function() {}
		}, option);

		this.id = '#'+id;
		var self = this;
		$(window).resize(function () { self.setPosition(); });
		$('#overlay').click(function () { self.hide(); });
		$(this.id + ' .close').click(function () { self.hide(); });
	},
	
	setTags: function(s){
		var userTags = [];
		$(this.id + ' li input').attr('checked', false);
		var tags = $.trim(s).split(/\s*,\s*/);

		for(var i in tags) {
			if (tags[i]=='') continue;
			var li = this.findLi(tags[i]);

			if (li != null) {
				li.find('input').attr('checked', true);
			} else {
				userTags.push(tags[i]);
			}
		}
		this.userTags = userTags;
	},
	
	findLi: function (tag) {
		var arr = $(this.id + ' li');
		for(var i=0; i < arr.length; i++) {
			var item = $(arr[i]);
			var text = $.trim(item.text());
			if (text == tag) return item;
		}
		return null;
	},
	
	getTags: function() {
		var tags = [];
		$.each($(this.id + ' li'), function() {
			if ($(this).find('input').is(':checked'))
				tags.push($.trim($(this).text()));
		});
		return this.userTags.length ? tags.concat(this.userTags) : tags;
	},
	
	show: function() {
		this.option.onShow.apply(this, arguments);
		this.setPosition();
		$('#overlay').fadeIn(200);
		$(this.id).show();
	},
	
	hide: function() {
		this.option.onHide.apply(this, arguments);
		$('#overlay').fadeOut(200);
		$(this.id).hide();
	},
	
	setPosition: function() {
		var ml = $(this.id).width()/2;
		var mt = $(this.id).height()/2;
		$(this.id).css('margin-left', '-'+ml+'px');
		$(this.id).css('margin-top', '-'+mt+'px');
	}
});